package com.tarena.lbs.basic.web.service;

import com.tarena.lbs.basic.web.repository.TagLibraryRepository;
import com.tarena.lbs.pojo.basic.po.TagLibraryPO;
import com.tarena.lbs.pojo.basic.vo.TagLibraryVO;
import com.tarena.lbs.pojo.basic.vo.TagVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@Slf4j
public class TagService {
    @Autowired
    private TagLibraryRepository tagLibraryRepository;
    public Map<String, List<TagVO>> getArticleTags() {
        //map String 一级大类标签名字 美食 旅游
        //map List 大类下的所有小类集合 并不是pos转的vos 还要做单独的封装
        //1.查询出来 部分1级 2级 所有标签列表 tag_type=0 文章标签
        List<TagLibraryPO> pos=tagLibraryRepository.getTagsByType(0);
        log.info("当前文章标签列表:{}",pos);
        //2.封装数据 调用私有方法(用户标签也要这样去封装)
        Map<String, List<TagVO>> mapVO=assembleTagVoMap(pos);
        return mapVO;
    }

    private Map<String, List<TagVO>> assembleTagVoMap(List<TagLibraryPO> pos) {
        //1.pos是没有分级别的 所有文章标签 包含美食 旅游 路边摊 网红店 高级酒店 日记 趣闻 传说
        Map<String,List<TagVO>> mapVO=new HashMap<>();
        //2.准备一个返回对象 map
        //3.从整体数据中挑选出 一级标签 tag_parent_id=0 stream 过滤 list
        List<TagLibraryPO> firstLevelPos=pos.stream().filter(po->po.getTagParentId()==0).collect(Collectors.toList());
        //4.通过对一级标签对象循环 获取其下所有的二级标签 将一级标签名字交给mapkey 将二级标签list做转化交给mapvalue
        for (TagLibraryPO firstLevelPo : firstLevelPos) {
            //4.1 获取一级标签 从po拿到名字 mapkey
            String tagName=firstLevelPo.getTagName();//map的key
            //4.2 筛选当前一级标签下的所有二级标签
            List<TagLibraryPO> secondLevelPos = pos.stream().filter(po -> po.getTagParentId() == firstLevelPo.getId()).collect(Collectors.toList());
            //4.3利用二级标签的集合 和一级标签的名字 可以封装TagVO
            List<TagVO> tagVos=secondLevelPos.stream().map(po->{
                //使用TagLibraryPO 创建TagVO
                TagVO vo=new TagVO();
                vo.setTagCategoryName(tagName);
                TagLibraryVO tagVo=new TagLibraryVO();
                BeanUtils.copyProperties(po,tagVo);
                vo.setTagLibraryBO(tagVo);
                return vo;
            }).collect(Collectors.toList());
            mapVO.put(tagName,tagVos);
        }
        log.info("封装的map数据:{}",mapVO);
        return mapVO;
    }
    //04、查询用户可绑定的兴趣爱好的标签
    public Map<String, List<TagVO>> getUserTags() {
        List<TagLibraryPO> pos = tagLibraryRepository.getTagsByType(1);
        return assembleTagVoMap(pos);
    }
}
